package com.hou.core;

import cn.hutool.core.date.*;
import cn.hutool.core.lang.Console;

import java.util.Date;

public class DateTimeDemo {

    public static void main(String[] args) {

    }
    /**
     * DateTime类继承于java.util.Date类，覆盖了toString()方法，
     * 返回yyyy-MM-dd HH:mm:ss形式的字符串，提供了众多便捷的方法对日期对象操作
     * 这些方法多是DateUtil静态方法的对象表现形式，使用DateTime对象可以完全替代开发中Date对象
     */
    public class DateTimeTest {

        public void test01(){
            // 构造器
            //new方式创建
            DateTime time = new DateTime(new Date());
            // 指定格式
            DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);
            Console.log(time);
            //of方式创建
            DateTime now = DateTime.now();
            DateTime dt = DateTime.of(DateUtil.yesterday());
        }

        public void test02(){
            DateTime dateTime = new DateTime("2021-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);

            //年，结果：2021
            int year = dateTime.year();

            //月份，结果：Month.JANUARY
            Month month = dateTime.monthEnum();

            //日，结果：5
            int day = dateTime.dayOfMonth();
        }

        public void test03(){
            // DateTime对象默认是可变对象（调用offset、setField、setTime方法默认变更自身，还是原来的对象），
            // 可以调用setMutable(false)方法使其变为不可变对象。
            // 在不可变模式下，offset、setField方法返回一个新对象，setTime方法抛出异常。

            DateTime dateTime = new DateTime("2017-01-05 12:34:23", DatePattern.NORM_DATETIME_FORMAT);

            //默认情况下DateTime为可变对象，此时offset == dateTime
            DateTime offset = dateTime.offset(DateField.YEAR, 1);
            // 此时dateTime已经被改变，offset=dateTime
            System.out.println(dateTime);

            //设置为不可变对象后变动将返回新对象，此时offset != dateTime
            dateTime.setMutable(false);
            offset = dateTime.offset(DateField.YEAR, 0);
        }
    }
}
